package geecache

import (
	"geecache/lru"
	"sync"
)
// 并发控制
type cache struct {
	// 实例化 lru ,增加了 互斥锁 封装 get add
	mu sync.Mutex
	lru *lru.Cache
	cacheBytes int64
}

func (c *cache) add(key string, value ByteView) {
	// 上锁
	c.mu.Lock()
	defer c.mu.Unlock()
	if c.lru == nil {
		// 延迟初始化
		c.lru = lru.New(c.cacheBytes, nil)
	}
	// 向缓存新增一个值
	c.lru.Add(key, value)
}

func (c *cache) get(key string) (value ByteView, ok bool) {
	c.mu.Lock()
	defer c.mu.Unlock()
	if c.lru == nil {
		return
	}
	if v, ok := c.lru.Get(key); ok {
		// 因为 ByteView拥有 Len()方法，实现了 Value接口
		// 类型断言，判断 v 是否是指向ByteView的值
		// v是一个接口类型， ByteView实现了此接口，断言成功
		return v.(ByteView), ok
	}
	return
}
